当前位置:  开发笔记 > 编程语言 > 正文

`layer.get_weights()`返回什么?

如何解决《`layer.get_weights()`返回什么?》经验,为你挑选了1个好方法。

我正在使用Keras做一些实验,我只是监控一个简单的mlp模型的重量更新:

# model contains one input layer in the format of dense, 
# one hidden layer and one output layer.
model=mlp() 
weight_origin=model.layers[0].get_weights()[0]
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(.....) # with adam optimizer
weight_updated=model.layers[0].get_weights()[0]
print weight_origin-weight_updated

对于第一个密集层,我得到了一个零矩阵.我认为训练不会改变这个重量.但是,其他层的权重会发生变化.所以我很困惑,为什么第一层没有变化?我检查了源代码,但仍然没有回答,然后我尝试监控:

model.layers[0].get_weights()[1] # get_weight() returns a list of weights

这一次,权重确实发生了变化.所以我想知道哪种重量是在训练期间起作用的"真实"重量?为什么重量列表中有两个元素?


定义mlp():

def mlp():
    model=Sequential()
    model.add(Dense(500, input_dim=784))
    model.add(Dense(503,init='normal',activation='relu'))
    model.add(Dense(503,init='normal',activation='relu'))
    model.add(Dense(10, activation='softmax'))
    return model

Ludwig Zhou.. 7

对于以下问题layer.get_weights():

我对这个问题进行了一些测试并检查了源代码.我发现该Dense层是它的一个子类Layer及其权重,它是一种python,它list有两个元素权重存储在,layer.get_weights()[0]bias存储在layer.get_weights()[1].

有一点需要注意,bias在定义图层时可以禁用:.在这种情况下,列表只有一个元素.如果在定义属性之后将其设置为,则仍然会有一个元素,并且在您拟合模型后将更新该元素.model.add(Dense(503,init='normal',activation='relu',bias=False))layer.get_weights()biasFalsebias

对于不更新的问题:

我设置了一个只有一个密集层的Sequential模型:

def mlp_2(): model=Sequential() model.add(Dense(10, input_dim=784, activation='softmax', bias =False)) return model

然后我用上面相同的方法编译和拟合它.这就是我得到的:

在此输入图像描述

它仍然似乎没有更新重量,但是,我们可以告诉重量肯定会改变.因为准确性在增加.我认为唯一的解释是第一dense层(你定义的input_dim)的更新对于Keras打印输出来说太小了.我没有检查权重的更精确的值,如果有人可以确定它,那将是很好的.



1> Ludwig Zhou..:

对于以下问题layer.get_weights():

我对这个问题进行了一些测试并检查了源代码.我发现该Dense层是它的一个子类Layer及其权重,它是一种python,它list有两个元素权重存储在,layer.get_weights()[0]bias存储在layer.get_weights()[1].

有一点需要注意,bias在定义图层时可以禁用:.在这种情况下,列表只有一个元素.如果在定义属性之后将其设置为,则仍然会有一个元素,并且在您拟合模型后将更新该元素.model.add(Dense(503,init='normal',activation='relu',bias=False))layer.get_weights()biasFalsebias

对于不更新的问题:

我设置了一个只有一个密集层的Sequential模型:

def mlp_2(): model=Sequential() model.add(Dense(10, input_dim=784, activation='softmax', bias =False)) return model

然后我用上面相同的方法编译和拟合它.这就是我得到的:

在此输入图像描述

它仍然似乎没有更新重量,但是,我们可以告诉重量肯定会改变.因为准确性在增加.我认为唯一的解释是第一dense层(你定义的input_dim)的更新对于Keras打印输出来说太小了.我没有检查权重的更精确的值,如果有人可以确定它,那将是很好的.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有